/**
 * 
 */
package com.nari.heatshare.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.nari.coreframe.service.IGenericService;
import com.nari.heatshare.model.IAssignMeterDataGather;
import com.nari.heatshare.utils.queryvo.AssignMeterDataCustomizedQuery;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResponseMsg;
import com.nari.platform.model.ResultWithPageCond;
import com.sohoometer.web.bean.AssignDataWithInfo;
import com.sohoometer.web.bean.QuestionData;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-18
 */
public interface IAssignMeterDataGatherService extends IGenericService<IAssignMeterDataGather, String> {

	/**
	 * 分页查询分配表数据列表
	 * @param concentratorNo 集中器号(可选)
	 * @param startDate 起始抄表时间(可选)
	 * @param endDate 终止抄表时间(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-2
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPage(String concentratorNo, 
			Date startDate, Date endDate, PageCond pageCond) throws Exception;
	
	/**
	 * 新增或修改分配表数据
	 * @param meterData
	 * 说明：新增分配表数据时，若表号相同、上传时间相同，则认为是重复数据，不予保存数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public ResponseMsg saveOrUpdateMeterData(IAssignMeterDataGather meterData) throws Exception;
	
	/**
	 * 删除分配表数据，并更新对应的任务批次信息
	 * @param meterDataUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2015-1-17
	 */
	public ResponseMsg deleteMeterDataByUID(String meterDataUID) throws Exception;
	
	/**
	 * 批量新增或修改分配表数据
	 * @param meterDataList
	 * 说明：新增分配表数据时，若表号相同、上传时间相同，则认为是重复数据，不予保存数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public ResponseMsg saveOrUpdateMeterDataBatch(List<IAssignMeterDataGather> meterDataList) throws Exception;
	
	/**
	 * 统计某个分摊域下对应某个上传日期的分配表数据上传率(百分比%)
	 * @param shareAreaUID 分摊域(必填)
	 * @param readTime 上传日期(必填)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public double calcUploadPercentByShareArea(String shareAreaUID, 
			Date readTime) throws Exception;
	
	/**
	 * 统计某个集中器下对应某个上传日期的分配表数据上传率(百分比%)
	 * @param concentratorNo 集中器号(必填)
	 * @param readTime 上传日期(必填)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public double calcUploadPercentByConcentrator(String concentratorNo, 
			Date readTime) throws Exception;
	
	/**
	 * 根据分摊域分页查询所属分配表数据
	 * @param shareAreaUID 分摊域唯一标识(必须)
	 * @param seriousNum 分配表表号(可选)
	 * @param readTime 上传时间(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-1
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByAreaUID(String shareAreaUID, 
			String seriousNum, Date readTime, PageCond pageCond) throws Exception;
	
	/**
	 * 根据分配表表表号、上传日期查询历史数据
	 * @param seriousNum 分配表表号
	 * @param readTime 上传日期
	 * @param dataLimit 取回历史数据的条数，若不限制，则取回所有历史数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-14
	 */
	public List<IAssignMeterDataGather> queryHistoryMeterData(String seriousNum, 
			Date readTime, Integer dataLimit) throws Exception;
	
	/**
	 * 新增分配表表平滑数据(包括人工干预数据和系统自动平滑数据)
	 * @param seriousNum 分配表表号
	 * @param readTime 上传时间
	 * @param readNum 分配表读数
	 * @param backTmperature 背板温度
	 * @param fontTemperature 前板温度
	 * @return 返回平滑数据的ID
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-15
	 */
	public String saveTransitionMeterData(String seriousNum, Date readTime, 
			double readNum, double backTmperature, double fontTemperature) throws Exception;
	
	/**
	 * 自动平滑分配表数据
	 * @param shareAreaUID
	 * @param startDate
	 * @param endDate
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-15
	 */
	public ResponseMsg saveAutoTransitionMeterData(String shareAreaUID, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 通过集中器上传批次任务(集中器号、抄表日期)分页查询分配表数据
	 * @param concentratorNo 任务批次上传的集中器号
	 * @param recordTime 任务批次上传的抄表日期
	 * @param seriousNum 分配表表号(可选)
	 * @param startDate 上传日期起始日期(可选)
	 * @param endDate 上传日期结束日期(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-25
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByUploadBatch(String concentratorNo, 
			Date recordTime, String seriousNum, Date startDate, Date endDate, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 分配表数据的合规性检查，并将不合规的分配表数据ID列表返回
	 * @param meterDataList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-25
	 */
	public String checkMeterDataLegality(List<IAssignMeterDataGather> meterDataList) throws Exception;
	
	/**
	 * 通过TXT上传的文件ID分页查询分配表数据
	 * @param dataFileUID TXT文件ID(必选)
	 * @param seriousNum 分配表号
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByFileID(String dataFileUID, 
			String seriousNum, PageCond pageCond) throws Exception;
	
//	/**
//	 * 根据相关任务批次、及分配表档案资料查询分配表数据的成功上传数
//	 * @param concentratorNo
//	 * @param recordTime
//	 * @param dataType
//	 * @return
//	 * @throws Exception
//	 * @author Xiaopeng
//	 * @date 2014-4-2
//	 */
//	public int queryUploadNumByReferBatch(String concentratorNo, Date recordTime, 
//			Integer dataType) throws Exception;
	
	/**
	 * 查询缺少基础档案信息的分配表数据对应的表号
	 * @param concentratorNo
	 * @param recordTime
	 * @param dataType
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-2
	 */
	public List<String> queryLackBaseinfoSeriousNum(String concentratorNo, Date recordTime, 
			Integer dataType) throws Exception;
	
	/**
	 * 根据任务批次信息查询分配表数据列表
	 * @param concentratorNo
	 * @param recordTime
	 * @param dataType
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-2
	 */
	public List<IAssignMeterDataGather> queryMeterDatasByBatch(String concentratorNo, 
			Date recordTime, Integer dataType) throws Exception;
	
	/**
	 * 根据任务批次信息查询不合规的分配表数据列表
	 * @param concentratorNo
	 * @param recordTime
	 * @param dataType
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-2
	 */
	public List<IAssignMeterDataGather> queryNonRationalDataByBatch(String concentratorNo, 
			Date recordTime, Integer dataType) throws Exception;
	
	/**
	 * 生成分配表数据的TXT文件
	 * @param meterDataList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-3
	 */
	public ResponseMsg generateTxtDebugFile(List<IAssignMeterDataGather> meterDataList) throws Exception;
	
	/**
	 * 分页查询分配表数据定制查询列表
	 * @param projectUID
	 * @param communityUID
	 * @param buildingUID
	 * @param recordTimeStart
	 * @param recordTimeEnd
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-9
	 */
	public ResultWithPageCond<AssignMeterDataCustomizedQuery> queryCustomizedQueryPage(String projectUID, 
			String communityUID, String buildingUID, Date recordTimeStart, 
			Date recordTimeEnd, PageCond pageCond) throws Exception;
	
	/**
	 * 查询单个楼栋的上传数据定制资料
	 * @param buildingUID
	 * @param recordDate
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2015-2-4
	 */
	public AssignMeterDataCustomizedQuery queryBuildingCustomizedQuery(String buildingUID, 
			Date recordDate) throws Exception;
	
	/**
	 * 通过定制查询列表查询与之关联的小区映射表
	 * @param customizedList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-11-29
	 */
	public Map<String, String> queryReferCommunitysByCustomizedList(List<AssignMeterDataCustomizedQuery> 
			customizedList) throws Exception;
	
	/**
	 * 通过定制查询列表查询与之关联的楼栋映射表
	 * @param customizedList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-11-29
	 */
	public Map<String, String> queryReferBuildingsByCustomizedList(List<AssignMeterDataCustomizedQuery> 
			customizedList) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属楼栋、抄表时间)统计分配表列表数据个数
	 * @param buildingUID
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-10
	 */
	public int countCustomizedAmDataList(String buildingUID, Date recordTime) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属楼栋、抄表时间)查询分配表数据列表
	 * @param buildingUID
	 * @param recordTime
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-14
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryCustomizedAmDataList(String buildingUID, 
			Date recordTime, PageCond pageCond) throws Exception;
	
	/**
	 * 查询与批次上传的上传时间不匹配的分配表数据ID
	 * @param concentratorNo
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-28
	 */
	public String queryNonMatchReadTime4Batch(String concentratorNo, Date recordTime) throws Exception;
	
	/**
	 * 统计分配表数据一个上传批次的成功上传数
	 * 成功上传数认定条件：
	 * (1)隶属于当前设定的上传批次，即具备相同的集中器号和抄表日期；
	 * (2)分配表数据上传日期与该批次上传日期一致；
	 * (3)抄表数据在档案中存在对应记录
	 * @param concentratorNo 集中器号
	 * @param recordTime 抄表日期
	 * @param readTime 上传时间
	 * @param dataType 数据类型
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2015-1-13
	 */
	public int countSuccessUploadNumReferBatch(String concentratorNo, Date recordTime, 
			Date readTime, Integer dataType) throws Exception;

	public abstract List<IAssignMeterDataGather> getUnUploadRegisteData(String concentratorNo, Date recordTime, Date readTime)
			throws Exception;

	public abstract ArrayList<QuestionData> getQuestionDatas(String concentratorNo, Date recordTime)
			throws Exception;

	public ArrayList<String> getQuestionDataIDs(
			ArrayList<QuestionData> questionDatas);
	
	public  ResultWithPageCond<AssignDataWithInfo> queryAssignDataWithInfo(String buildingUID, Date recordTime,
			PageCond pageCond) throws Exception;
	
	
	
	
	
	
	
	
	
	
	/**
	 * 分页查询分配表数据列表
	 * @param seriousNum 分配表号
	 * @param startDate 起始抄表时间
	 * @param endDate 终止抄表时间
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-2
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataAllotPage(String seriousNum, 
			Date startDate, Date endDate, PageCond pageCond) throws Exception;
	
	public List<IAssignMeterDataGather> queryAllSeriousNumInOrderList(String seriousNum, 
			Date recordTime) throws Exception;
	
}
